﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using Member.EF.Model;

public class CurrentHttpContext
{
    #region Properties

    /// <summary>
    /// Gibt an ob JavaScript ein oder ausgeschalten ist.
    /// TRUE->Eingeschalten | FALSE->Ausgeschalten
    /// </summary>
    private static string m_httpContextName = "EFDataModelHttpContextName";
    #endregion

    /// <summary>
    /// Gibt den aktuellen DataModelContainer für diesen Request zurück.
    /// </summary>
    public static MemberModelContainer GetDataModel()
    {
        //Quellen:
        //http://csharpquestions.com/entity-framework/scope-of-entity-framework-object-context-in-asp-net-websites
        //http://dotnetslackers.com/articles/ado_net/Managing-Entity-Framework-ObjectContext-lifespan-and-scope-in-n-layered-ASP-NET-applications.aspx

        //Den aktuellen dataContext nur für den aktuellen Request speichern
        if (HttpContext.Current.Items[m_httpContextName] == null)
        {
            //Connectionstring wird anhand des ModelNamens aus der web.config geladen
            MemberModelContainer efModelContainer = new MemberModelContainer(GetConnectionString("MemberModel"));
            HttpContext.Current.Items.Add(m_httpContextName, efModelContainer);
        }

        return (MemberModelContainer)HttpContext.Current.Items[m_httpContextName];
    }

    /// <summary>
    /// Gibt den Connectionstring zur DB zurück für das EntityFramework
    /// </summary>
    public static string GetConnectionString(string modelName)
    {
        //Initialize the EntityConnectionStringBuilder.
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        //Providernamen setzten
        entityBuilder.Provider = "System.Data.SqlClient";
        //Connectionstring setzten
        entityBuilder.ProviderConnectionString = GetSqlBuilder().ToString();
        //Metadaten setzten.
        entityBuilder.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", modelName);
        return entityBuilder.ConnectionString;
    }

    public static SqlConnectionStringBuilder GetSqlBuilder()
    {
        SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
        //Die Zugangsdaten aus der Web.Config laden, nicht den Connectionstring verwenden.
        sqlBuilder.DataSource = ConfigurationManager.AppSettings["DBDataSource"]; ;
        sqlBuilder.InitialCatalog = ConfigurationManager.AppSettings["DBCatalog"]; ;
        sqlBuilder.UserID = ConfigurationManager.AppSettings["DBUser"];
        sqlBuilder.Password = ConfigurationManager.AppSettings["DBPassword"];
        //Wichtige Option damit mehrere Abfragen geöffnet werden können 
        //um Subabfragen ausführen zu können von Untergordneten Projekten
        sqlBuilder.MultipleActiveResultSets = true;
        sqlBuilder.IntegratedSecurity = false;
        //Dient zur Identifizierung der DB Connection/Application wenn man z.B: Fehler auf dem DB Server sucht.
        sqlBuilder.ApplicationName = "MemberManagement";

        return sqlBuilder;
    }
}
